#ifndef DECODER_H_
#define DECODER_H_
#include <iostream>
#include <string>
#include <map>
#include "../Server/src/messages/register.h"
#include "../Server/src/messages/data.h"
#include "../Server/src/messages/file_not_found.h"
#include "../Server/src/messages/files_list.h"
#include "../Server/src/messages/get_file.h"
#include "../Server/src/messages/get_files_list.h"
#include "../Server/src/messages/logging_error.h"
#include "../Server/src/messages/logging_ok.h"
#include "../Server/src/messages/message.h"
#include "../Server/src/messages/no_files.h"
#include "../Server/src/messages/notify.h"
#include "../Server/src/messages/put_error.h"
#include "../Server/src/messages/put_file.h"
#include "../Server/src/messages/put_ok.h"
#include "../Server/src/messages/unregister.h"

/***IDS****
 0:REGISTER
 1:LOGGING-OK
 2:LOGGING-ERROR
 3:GET-FILES-LIST
 4:FILES-LIST
 5:GET
 6:DATA
 7:PUT
 8:PUT-OK
 9:PUT-ERROR
 10:NOTIFY
 11:UNREGISTER
 ***********/


class Decoder {
public:
	typedef std::string File_Name; // Nombre de archivo
	typedef std::string Hash; // Hash
	typedef std::map<File_Name, Hash> Map; // Map que tiene como clave el nombre de archivo, y como valor su Hash
public:
	/* Constructor */
	Decoder();

	/* Parsea los primeros bytes para identificar que tipo de mensaje es, y luego
	 * llama al metodo que se encargara de parsear los campos*/
	Message* parser(std::string& receive);

	/* Arma el map de nombres de archivos con sus respectivos hashes*/
	FilesList* receive_list(std::string& receive);

	/* Parsea el nombre de usuario, y su contraseña */
    Register* register_to_server(std::string& receive);

	/* Parsea el nombre del archivo*/
    std::string get_file_name(std::string& receive);

    /* Devuelve un msg con el nombre del archivo solicitado por el cliente*/
    GetFile* get_file(std::string& receive);

    /* Enviado por el servidor en caso que el archivo solicitado no exista */
    FileNotFound* file_not_found(std::string& receive);

	/* Transferencia del archivo desde el cliente al servidor */
	PutFile* put(std::string& receive);

	/* Notificacion de cambio, borrado o agregado de algun archivo*/
	Notify* notify(std::string& receive);

	Data* data(std::string& receive);

	/* Destructor*/
	virtual ~Decoder();
};

#endif /* DECODER_H_ */

